package com.yzh.springboot_rbac.utils;



/*总结几个注意点：
*   1.java类里面是属性和方法，其他逻辑代码必须写在方法体里面或者静态代码块里面
*     和C语言不一样，否则编译会报错，这是根据java代码规范写的。
*   2.java类的属性不赋值，默认会自动赋值，但是方法里面的局部变量，只定义，没有复制，
*       使用前一定要赋值否则，报错
*   3.map的put居然后返回值？
*       TreeNode put = hashMap.put(node.getId(), node);
            如果 node.getId() 已经存在于 HashMap 中，put 方法会返回与该键关联的 旧的 TreeNode。
            如果 node.getId() 不存在于 HashMap 中，put 方法会返回 null。*/

import com.yzh.springboot_rbac.utils.TreeNode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/*此类用于构建树结构
 *   1.创建map集合，存储所有树节点
 *      注意方法返回类型还是TreeNode类型，是一个嵌套的节点，扩散后是一个树结构*/
/*   2.遍历传入的节点集合，放到map集合里面*/
/*···3.再次遍历节点集合，根据每个节点的id判断是否是根节点
 *       是：把它付给root，初始化root是空的
 *       否：找到其父节点，把他放到父节点的子结点中*/

/*笔记中的方法有些问题：
* 1.需要在他笔记的基础上多处理三个异常
*        要处理三个空指针异常
             1.这里要判断一下父节点是不是为空
             2.children要初始化，否则默认为null
             3.root默认为null
  2.测试中输出json格式，他的那种方法不行，需要转换基本类型或者map，list
  * 使用这个方法
  *    // 使用 Jackson 序列化
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(tree);
        System.out.println(json); */


public class Tree {
    /*构建树结构的方法传参：所有节点集合*/
    public static TreeNode buildTree(List<TreeNode> nodes) throws IllegalAccessException {
        /*1.创建一个map集合存放所有树节点，一个树节点对应数据库表里面的一条数据*/
        HashMap<Integer, TreeNode> hashMap = new HashMap<>();
        TreeNode root = null;
        /*2.遍历传入的节点集合，放到map集合里面*/
        for (TreeNode node : nodes) {
            hashMap.put(node.getId(), node);
        }
        /*3.再次遍历节点集合，根据每个节点的id判断是否是根节点
        *       是：把它付给root，初始化root是空的
        *       否：找到其父节点，把他放到父节点的子结点中*/
        for (TreeNode node : nodes) {
            if (node.getParent_id() == 0) {
                if (root != null) {
                    throw new IllegalAccessException("树结构中存在多个节点");
                }
                root = node;
            } else {
//                要处理三个空指针异常
//                1.这里要判断一下父节点是不是为空
                /*2.children要初始化，否则默认为null
                * 3.root默认为null*/
               /* List<TreeNode> children = hashMap.get(node.getParent_id()).getChildren();
                children.add(node);*/


                /*注意这里是根据node的parent_id去查的*/
                TreeNode parentNode = hashMap.get(node.getParent_id());
                if (parentNode != null) {
                    if (parentNode.getChildren() == null) {
                        parentNode.setChildren(new ArrayList<>());
                    }
                    parentNode.getChildren().add(node);
                }
            }
        }
        return root;
    }
}
